1 module unde.games.dizzy.omega.animations.stone_00; 2 3 import derelict.opengl3.gl; 4 import std.conv; 5 import std.math; 6 import unde.games.collision_detector; 7 import unde.games.object; 8 import unde.games.renderer; 9 import unde.global_state; 10 11 class Stone00:StaticGameObject 12 { 13 StaticGameObject the_hero; 14 15 this(MainGameObject root, StaticGameObject hero) 16 { 17 frame = -1; 18 the_hero = hero; 19 20 models["stone-00"] = root.models["stone-00"]; 21 models["small-stone-00"] = root.models["small-stone-00"]; 22 super(root); 23 } 24 25 override void draw(GlobalState gs) 26 { 27 if (abs(root.scrx-0.0) > 16.0 || 28 abs(root.scry-0.0) > 9.0) return; 29 30 float f = 0.0; 31 if (frame >= 0) 32 { 33 f = root.frame - frame; 34 } 35 36 glPushMatrix(); 37 if (f <= 0.0) 38 { 39 glTranslatef(9.9, 1.2, 0.7); 40 } 41 else if (f < 100.0) 42 { 43 glTranslatef(9.9 - (9.9-6.7)*f/100.0, 1.2 - (1.2-0.7)*f/100.0, 0.7); 44 glRotatef(83.0*f/100.0, 0.0, 0.0, 1.0); 45 } 46 else if (f < 200.0) 47 { 48 glTranslatef(6.7 - (6.7-4.1)*(f-100.0)/100.0, 0.7 - (0.7+3.6)*(f-100.0)/100.0, 0.7); 49 glRotatef(83.0+(222.0-83.0)*(f-100.0)/100.0, 0.0, 0.0, 1.0); 50 root.collision_objects["solid"]["Stone"] = root.collision_objects["temp-solid"]["Stone"]; 51 reset_collision_cache(); 52 } 53 else if (f < 250.0) 54 { 55 glTranslatef(4.1, -3.6 - (-3.6+6.1)*(f-200.0)/50.0, 0.7); 56 glRotatef(222.0, 0.0, 0.0, 1.0); 57 } 58 else 59 { 60 glTranslatef(4.1, -6.1, 0.7); 61 glRotatef(222.0, 0.0, 0.0, 1.0); 62 } 63 recursive_render(gs, models["stone-00"]); 64 glPopMatrix(); 65 66 glPushMatrix(); 67 if (f <= 0.0) 68 { 69 glTranslatef(8.7, -0.6, 0.7); 70 recursive_render(gs, models["small-stone-00"]); 71 } 72 else if (f < 300.0) 73 { 74 glTranslatef(8.7-f/5.0, -0.6-f/10.0, 0.7); 75 recursive_render(gs, models["small-stone-00"]); 76 } 77 glPopMatrix(); 78 } 79 80 override bool tick(GlobalState gs) 81 { 82 if (frame < 0 && the_hero.x > 6.6) 83 { 84 frame = root.frame; 85 } 86 87 return true; 88 } 89 90 override void load(string[string] s) 91 { 92 if ("stone00-frame" in s) 93 frame = s["stone00-frame"].to!(long); 94 else 95 frame = -1; 96 97 float f = 0.0; 98 if (frame >= 0) 99 { 100 f = root.frame - frame; 101 } 102 103 if (f > 100.0) 104 { 105 root.collision_objects["solid"]["Stone"] = root.collision_objects["temp-solid"]["Stone"]; 106 reset_collision_cache(); 107 } 108 else 109 { 110 root.collision_objects["solid"]["Stone"] = null; 111 root.collision_objects["solid"].remove("Stone"); 112 reset_collision_cache(); 113 } 114 } 115 116 override void save(ref string[string] s) 117 { 118 if (frame >= 0) 119 { 120 s["stone00-frame"] = frame.to!(string); 121 } 122 } 123 }